package com.zhentao.controller;

import com.aliyun.ocr_api20210707.Client;
import com.aliyun.ocr_api20210707.models.RecognizeIdcardResponse;
import com.zhentao.config.AliyunOcrConfig;
import com.zhentao.result.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * OCR身份证识别控制器
 * 提供身份证图片识别功能的REST API
 */
@RestController
@RequestMapping("/api/ocr")
@CrossOrigin(origins = "*")
public class OcrController {

    private static final Logger logger = LoggerFactory.getLogger(OcrController.class);

    @Autowired
    private Client ocrClient;

    @Autowired
    private AliyunOcrConfig ocrConfig;

    /**
     * 身份证识别接口
     * @param file 身份证图片文件
     * @return 识别结果
     */
    @PostMapping("/idcard")
    public Result recognizeIdcard(@RequestParam("file") MultipartFile file) {
        logger.info("收到身份证识别请求，文件名: {}, 文件大小: {} bytes", file.getOriginalFilename(), file.getSize());
        
        // 验证文件
        if (file.isEmpty()) {
            logger.warn("上传的文件为空");
            return Result.failed("请选择要识别的身份证图片");
        }

        // 验证文件类型
        String contentType = file.getContentType();
        if (contentType == null || !isImageFile(contentType)) {
            logger.warn("不支持的文件类型: {}", contentType);
            return Result.failed("仅支持上传图片文件(jpg, jpeg, png, bmp)");
        }

        // 验证文件大小 (限制为10MB)
        if (file.getSize() > 10 * 1024 * 1024) {
            logger.warn("文件大小超过限制: {} bytes", file.getSize());
            return Result.failed("文件大小不能超过10MB");
        }

        try (InputStream imageStream = file.getInputStream()) {
            // 调用OCR识别服务
            RecognizeIdcardResponse response = ocrConfig.recognizeIdcard(ocrClient, imageStream);
            
            // 解析识别结果
            Map<String, Object> result = parseIdcardResult(response);
            
            logger.info("身份证识别成功，文件: {}", file.getOriginalFilename());
            return Result.success("身份证识别成功", result);
            
        } catch (IOException e) {
            logger.error("读取上传文件失败: {}", e.getMessage(), e);
            return Result.failed("文件读取失败，请重试");
        } catch (Exception e) {
            logger.error("身份证识别失败: {}", e.getMessage(), e);
            return Result.failed("身份证识别失败: " + e.getMessage());
        }
    }

    /**
     * 获取OCR服务状态
     * @return 服务状态信息
     */
    @GetMapping("/status")
    public Result getOcrStatus() {
        Map<String, Object> status = new HashMap<>();
        status.put("service", "阿里云OCR身份证识别");
        status.put("endpoint", ocrConfig.getEndpoint());
        status.put("regionId", ocrConfig.getRegionId());
        status.put("timeout", ocrConfig.getTimeout());
        status.put("status", "正常");
        
        return Result.success("OCR服务状态正常", status);
    }

    /**
     * 检查文件是否为图片类型
     * @param contentType 文件类型
     * @return 是否为图片
     */
    private boolean isImageFile(String contentType) {
        return contentType.equals("image/jpeg") ||
               contentType.equals("image/jpg") ||
               contentType.equals("image/png") ||
               contentType.equals("image/bmp") ||
               contentType.equals("image/gif");
    }

    /**
     * 解析身份证识别结果
     * @param response OCR识别响应
     * @return 格式化的结果
     */
    private Map<String, Object> parseIdcardResult(RecognizeIdcardResponse response) {
        Map<String, Object> result = new HashMap<>();
        
        if (response == null || response.getBody() == null) {
            result.put("success", false);
            result.put("message", "识别结果为空");
            return result;
        }

        try {
            result.put("success", true);
            result.put("message", "识别成功");
            
            // 基本信息 - 使用原始响应数据
            Map<String, Object> idcardInfo = new HashMap<>();
            
            // 获取响应体的数据部分
            String responseData = response.getBody().getData();
            
            // 将响应数据直接返回，让前端处理或者后续可以根据实际API文档进行解析
            result.put("rawData", responseData);
            result.put("idcardInfo", idcardInfo);
            
            // 添加请求ID用于追踪
            if (response.getBody().getRequestId() != null) {
                result.put("requestId", response.getBody().getRequestId());
            }
            
            logger.info("身份证识别结果解析完成，requestId: {}", 
                response.getBody().getRequestId());
            
        } catch (Exception e) {
            logger.error("解析身份证识别结果失败: {}", e.getMessage(), e);
            result.put("success", false);
            result.put("message", "结果解析失败: " + e.getMessage());
        }
        
        return result;
    }

    /**
     * 健康检查接口
     * @return 健康状态
     */
    @GetMapping("/health")
    public Result healthCheck() {
        return Result.success("健康检查通过", "OCR服务运行正常");
    }
}
